// Copyright (C) 2024 Huawei Device Co., Ltd.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use cxx::UniquePtr;

use crate::ability::Ability;
use crate::wrapper::{AbilityWrapper, BuildSystemAbility, RegisterAbility, SystemAbilityWrapper};

pub struct SystemAbility {
    inner: UniquePtr<SystemAbilityWrapper>,
}

impl SystemAbility {
    pub fn new(c_wrapper: UniquePtr<SystemAbilityWrapper>) -> Self {
        Self { inner: c_wrapper }
    }

    pub fn register(self) {
        info!("SA registry");
        unsafe {
            RegisterAbility(self.inner.into_raw());
        }
    }


}

pub fn build_system_ability<A: Ability + 'static>(
    ability: A,
    said: i32,
    run_on_create: bool,
) -> SystemAbility {
    info!("build system ability");
    let ability = Box::new(AbilityWrapper {
        inner: Box::new(ability),
    });

    SystemAbility {
        inner: BuildSystemAbility(ability, said, run_on_create),
    }
}
